package com.cencat.vehicle.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.vehicle.dto.*;
import com.cencat.vehicle.entity.Vehicle;
import com.cencat.vehicle.vo.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 车辆服务接口
 *
 * @author cencat
 * @version 1.0
 * @since 2024-12-19
 */
public interface VehicleService {

    /**
     * 分页查询车辆列表
     *
     * @param page  分页参数
     * @param query 查询条件
     * @return 车辆列表
     */
    Page<VehicleVO> getVehiclePage(Page<VehicleVO> page, VehicleQueryDTO query);

    /**
     * 根据ID获取车辆详情
     *
     * @param vehicleId 车辆ID
     * @return 车辆详情
     */
    VehicleVO getVehicleById(Long vehicleId);

    /**
     * 创建车辆
     *
     * @param createDTO 创建参数
     * @return 是否成功
     */
    Boolean createVehicle(VehicleCreateDTO createDTO);

    /**
     * 更新车辆
     *
     * @param updateDTO 更新参数
     * @return 是否成功
     */
    Boolean updateVehicle(VehicleUpdateDTO updateDTO);

    /**
     * 删除车辆
     *
     * @param vehicleId 车辆ID
     * @return 是否成功
     */
    Boolean deleteVehicle(Long vehicleId);

    /**
     * 批量删除车辆
     *
     * @param vehicleIds 车辆ID列表
     * @return 是否成功
     */
    Boolean batchDeleteVehicles(List<Long> vehicleIds);

    /**
     * 更新车辆状态
     *
     * @param vehicleId 车辆ID
     * @param status    车辆状态
     * @return 是否成功
     */
    Boolean updateVehicleStatus(Long vehicleId, Integer status);

    /**
     * 批量更新车辆状态
     *
     * @param vehicleIds 车辆ID列表
     * @param status     车辆状态
     * @return 是否成功
     */
    Boolean batchUpdateVehicleStatus(List<Long> vehicleIds, Integer status);

    /**
     * 获取车辆统计数据
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 统计数据
     */
    VehicleStatisticsVO getVehicleStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取车辆趋势数据
     *
     * @param days 天数
     * @return 趋势数据
     */
    List<VehicleTrendVO> getVehicleTrend(Integer days);

    /**
     * 获取车辆排行榜
     *
     * @param type  排行类型
     * @param limit 限制数量
     * @return 排行榜数据
     */
    List<VehicleRankingVO> getVehicleRanking(Integer type, Integer limit);

    /**
     * 获取车辆分布数据
     *
     * @param type 分布类型
     * @return 分布数据
     */
    List<VehicleDistributionVO> getVehicleDistribution(Integer type);

    /**
     * 获取司机车辆列表
     *
     * @param driverId 司机ID
     * @param status   车辆状态
     * @return 车辆列表
     */
    List<VehicleVO> getDriverVehicles(Long driverId, Integer status);

    /**
     * 获取商户车辆列表
     *
     * @param merchantId 商户ID
     * @param status     车辆状态
     * @return 车辆列表
     */
    List<VehicleVO> getMerchantVehicles(Long merchantId, Integer status);

    /**
     * 获取附近车辆
     *
     * @param longitude 经度
     * @param latitude  纬度
     * @param radius    半径(公里)
     * @param limit     限制数量
     * @return 车辆列表
     */
    List<VehicleVO> getNearbyVehicles(Double longitude, Double latitude, Double radius, Integer limit);

    /**
     * 智能车辆匹配
     *
     * @param matchDTO 匹配参数
     * @return 匹配结果
     */
    List<VehicleMatchVO> smartVehicleMatch(VehicleMatchDTO matchDTO);

    /**
     * 获取车辆轨迹
     *
     * @param vehicleId 车辆ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 轨迹列表
     */
    List<VehicleTrackVO> getVehicleTrack(Long vehicleId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 更新车辆位置
     *
     * @param locationDTO 位置信息
     * @return 是否成功
     */
    Boolean updateVehicleLocation(VehicleLocationDTO locationDTO);

    /**
     * 获取车辆维护记录
     *
     * @param vehicleId 车辆ID
     * @return 维护记录列表
     */
    List<VehicleMaintenanceVO> getVehicleMaintenance(Long vehicleId);

    /**
     * 添加车辆维护记录
     *
     * @param maintenanceDTO 维护记录
     * @return 是否成功
     */
    Boolean addVehicleMaintenance(VehicleMaintenanceDTO maintenanceDTO);

    /**
     * 获取车辆保险信息
     *
     * @param vehicleId 车辆ID
     * @return 保险信息
     */
    VehicleInsuranceVO getVehicleInsurance(Long vehicleId);

    /**
     * 更新车辆保险信息
     *
     * @param insuranceDTO 保险信息
     * @return 是否成功
     */
    Boolean updateVehicleInsurance(VehicleInsuranceDTO insuranceDTO);

    /**
     * 导出车辆数据
     *
     * @param query 查询条件
     * @return 导出结果
     */
    VehicleExportVO exportVehicles(VehicleQueryDTO query);

    /**
     * 获取车辆详细信息
     *
     * @param vehicleId 车辆ID
     * @return 车辆详细信息
     */
    VehicleDetailVO getVehicleDetail(Long vehicleId);

    /**
     * 搜索车辆
     *
     * @param keyword    搜索关键词
     * @param searchType 搜索类型
     * @param limit      限制数量
     * @return 车辆列表
     */
    List<VehicleVO> searchVehicles(String keyword, String searchType, Integer limit);

    /**
     * 获取推荐车辆
     *
     * @param driverId 司机ID
     * @param limit    限制数量
     * @return 车辆列表
     */
    List<VehicleVO> getRecommendedVehicles(Long driverId, Integer limit);

    /**
     * 获取车辆性能数据
     *
     * @param vehicleId 车辆ID
     * @return 性能数据
     */
    VehiclePerformanceVO getVehiclePerformance(Long vehicleId);

    /**
     * 获取车辆优化建议
     *
     * @param vehicleId 车辆ID
     * @return 优化建议
     */
    List<String> getVehicleOptimizationSuggestions(Long vehicleId);

    /**
     * 检查车辆是否存在
     *
     * @param plateNumber 车牌号
     * @return 是否存在
     */
    Boolean checkVehicleExists(String plateNumber);

    /**
     * 获取相似车辆
     *
     * @param vehicleId 车辆ID
     * @param limit     限制数量
     * @return 车辆列表
     */
    List<VehicleVO> getSimilarVehicles(Long vehicleId, Integer limit);

    /**
     * 更新车辆评分
     *
     * @param vehicleId 车辆ID
     * @param rating    评分
     * @return 是否成功
     */
    Boolean updateVehicleRating(Long vehicleId, Double rating);

}